package cn.yx.sys.remote.service.impl;

import cn.yx.common.core.exception.AppException;
import cn.yx.common.core.pojo.base.BaseConfig;
import cn.yx.common.core.util.reflect.ClassUtil;
import cn.yx.common.core.util.reflect.ReflectUtil;
import cn.yx.sys.cond.SysConfigCond;
import cn.yx.sys.cond.SysConfigDetailCond;
import cn.yx.sys.dto.SysConfigDetailDto;
import cn.yx.sys.dto.SysConfigDto;
import cn.yx.sys.remote.cond.SysConfigRemoteCond;
import cn.yx.sys.remote.constant.message.SysConfigRemoteServiceImplMessageKey;
import cn.yx.sys.remote.dto.SysConfigRemoteDto;
import cn.yx.sys.remote.mapping.SysConfigRemoteMapping;
import cn.yx.sys.remote.service.SysConfigRemoteService;
import cn.yx.sys.service.SysConfigDetailService;
import cn.yx.sys.service.SysConfigService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * <p>系统配置远程服务接口实现类</p>
 *
 * @author Wgssmart
 */
@DubboService
@Slf4j
public class SysConfigRemoteServiceImpl implements SysConfigRemoteService {

    private final SysConfigService sysConfigService;
    private final SysConfigDetailService sysConfigDetailService;

    public SysConfigRemoteServiceImpl(SysConfigService sysConfigService, SysConfigDetailService sysConfigDetailService) {
        this.sysConfigService = sysConfigService;
        this.sysConfigDetailService = sysConfigDetailService;
    }

    @Override
    @SuppressWarnings({"unchecked"})
    public <T extends BaseConfig> SysConfigRemoteDto<T> getOne(SysConfigRemoteCond sysConfigRemoteCond, Class<T> clazz) {
        // 获取SysConfigDto
        SysConfigCond sysConfigCond = SysConfigRemoteMapping.INSTANCE.otherToCond(sysConfigRemoteCond);
        SysConfigDto sysConfigDto = sysConfigService.getOne(sysConfigCond);

        if (Objects.isNull(sysConfigDto)) {
            log.error("sys config not found, config name: {}", sysConfigRemoteCond.getName());
            // @SimplifiedChinese=未找到系统配置
            // @English=Sys config not found
            throw new AppException(SysConfigRemoteServiceImplMessageKey.SYS_CONFIG_NOT_FOUND);
        }
        // 根据sys_config_id获取SysConfigDetailDto
        SysConfigDetailCond sysConfigDetailCond = new SysConfigDetailCond();
        sysConfigDetailCond.setSysConfigId(sysConfigDto.getId());
        List<SysConfigDetailDto> sysConfigDetailDtoList = sysConfigDetailService.listAll(sysConfigDetailCond);

        SysConfigRemoteDto<T> sysConfigRemoteDto = SysConfigRemoteMapping.INSTANCE.dtoToOther(sysConfigDto);

        Map<String, Object> propertyParamMap = new HashMap<>(sysConfigDetailDtoList.size());
        for (SysConfigDetailDto sysConfigDetailDto : sysConfigDetailDtoList) {
            propertyParamMap.put(sysConfigDetailDto.getParameter(), sysConfigDetailDto.getValue());
        }
        // 构建指定的配置详情类
        T configDetail = ClassUtil.newInstance(clazz);
        ReflectUtil.invokeSetters(configDetail, propertyParamMap);
        sysConfigRemoteDto.setConfigDetail(configDetail);
        return sysConfigRemoteDto;
    }

}
